﻿/***********************************************************************
 * CLR 版本: 4.0.30319.225
 * 工程名称: $projectname$
 * 命名空间: Toulr.Util.Geography
 * 文件名称: GeoPoint
 * 描    述: 
 * 作    者: 18901309129@189.cn
 * 登录用户: hyyu
 * 创建时间: 2011-6-14 18:55:41
 * 创建年份: 2011
 * Update History: 
 ***********************************************************************/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace Toulr.Util.Geography
{
    /// <summary>
    /// 地理经纬度
    /// </summary> 
    public struct GeoPoint
    {
        public static readonly GeoPoint Empty;

        static GeoPoint()
        {
            Empty = new GeoPoint(double.NaN, double.NaN);
        }

        private readonly double latitude;
        private readonly double longitude;

        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="latitude"></param>
        /// <param name="longitude"></param>
        public GeoPoint(double latitude, double longitude)
        {
            this.latitude = latitude;
            this.longitude = longitude;
        }

        /// <summary>
        /// 经度
        /// </summary>
        public double Longitude
        {
            get { return longitude; }
        }

        /// <summary>
        /// 纬度
        /// </summary>
        public double Latitude
        {
            get { return latitude; }
        }

        [Browsable(false)]
        public bool IsEmpty
        {
            get { return Longitude == double.NaN && Latitude == double.NaN; }
        }

        public GeoPoint Add(double latDelta, double lngDelta)
        {
            return new GeoPoint(latitude + latDelta, longitude + lngDelta);
        }

        public override string ToString()
        {
            double lng = Math.Abs(Longitude);
            double lat = Math.Abs(Latitude);

            string lngText = (lng < double.Epsilon) ? null :
                (Longitude > 0 ? GeoPointText.LngTextE : GeoPointText.LngTextW);

            string latText = (lat < double.Epsilon) ? null :
                (Latitude > 0 ? GeoPointText.LatTextN : GeoPointText.LatTextS);

            string result = string.Format(GeoPointText.FormatPattern,
                Math.Round(lat, 6), Math.Round(lng, 6), latText, lngText);
            return result;
        }

        public bool IsInPolygon(GeoPoint[] polygon)
        {
            return GeoUtils.IsPointInsidePolygon(this, polygon);
        }
    }
}
